dnl
include(`foreach.m4')dnl
dnl
include(`datatypes.m4')dnl
dnl
dnl Note that, irritatingly, we have to exclude the possibility of
dnl a scalar character subroutine in order to not overlap with the
dnl basic one to which we are calling through.
dnl
define(`TOHWM4_subroutinename', `dnl
ifelse(`$2$3', `ScalarCh', `', `dnl
module procedure $1$2$3')`'dnl
')`'dnl
dnl
dnl First arg is name of quantity (Character, Attribute, PseudoAttribute)
dnl Second arg is whether this is scalar, array, or matrix.
dnl Third arg is type of property(character/logical etc.)
dnl
define(`TOHWM4_CharacterSub',`dnl
ifelse(`$2$3', `ScalarCh', `', `dnl
  subroutine $1$2$3 &
    (xf, chars`'dnl
ifelse(substr($3,0,4),`Real',`, fmt', substr($3,0,5), `Cmplx', `, fmt', `$2$3', `ScalarCh', `', `$3', `Ch', `, delimiter'))

    type(xmlf_t), intent(inout) :: xf
    TOHWM4_declarationtype(`$3'), intent(in) dnl
ifelse(`$2', `Array', `, dimension(:)', `$2', `Matrix',`, dimension(:,:)') dnl
 :: chars
dnl
ifelse(substr($3,0,4), `Real', `dnl 
    character(len=*), intent(in), optional :: fmt
', substr($3,0,5), `Cmplx', `dnl
    character(len=*), intent(in), optional :: fmt
', `$2$3', `ScalarCh', `', `$3', `Ch', `dnl
    character(len=1), intent(in), optional :: delimiter
')dnl

#ifndef DUMMYLIB
ifelse(substr($3,0,4), `Real', `dnl 
    if (present(fmt)) then
      call xml_Add$1(xf=xf, chars=str(chars, fmt)`'dnl
ifelse(`$2', `Array', `, ws_significant=.false.')`'dnl
ifelse(`$2', `Matrix', `, ws_significant=.false.'))
    else
  ', substr($3,0,5), `Cmplx', `dnl
    if (present(fmt)) then
      call xml_Add$1(xf=xf, chars=str(chars, fmt)`'dnl
ifelse(`$2', `Array', `, ws_significant=.false.')`'dnl
ifelse(`$2', `Matrix', `, ws_significant=.false.'))
    else
  ')dnl
ifelse(substr($3,0,5), `Cmplx', `    ! Add empty optional fmt arg to str to avoid PGI bug: 
  ')dnl
    call xml_Add$1(xf=xf, chars=str(chars`'dnl
ifelse(`$2$3', `ScalarCh', `', `$3', `Ch', `, delimiter', substr($3,0,5), `Cmplx', `, ""'))`'dnl
ifelse(`$2', `Array', `, ws_significant=.false.')`'dnl
ifelse(`$2', `Matrix', `, ws_significant=.false.')`'dnl
)
dnl
ifelse(substr($3,0,4), `Real', `dnl
    endif
', substr($3,0,5), `Cmplx', `dnl
    endif
')`'dnl
#endif
  end subroutine $1$2$3
')
')dnl
dnl
dnl
define(`TOHWM4_AttributeSub',`dnl
ifelse(`$2$3', `ScalarCh', `', `dnl
  subroutine $1$2$3 &
    (xf, name, value`'dnl
ifelse(substr($3,0,4),`Real',`, fmt', substr($3,0,5), `Cmplx', `, fmt', `$2$3', `ScalarCh', `', `$3', `Ch', `, delimiter')) 

    type(xmlf_t), intent(inout) :: xf
    character(len=*), intent(in) :: name
    TOHWM4_declarationtype(`$3'), intent(in) dnl
ifelse(`$2', `Array', `, dimension(:)', `$2', `Matrix',`, dimension(:,:)') dnl
 :: value
dnl
ifelse(substr($3,0,4), `Real', `dnl 
    character(len=*), intent(in), optional :: fmt
', substr($3,0,5), `Cmplx',`dnl
    character(len=*), intent(in), optional :: fmt
', `$2$3', `ScalarCh', `', `$3', `Ch', `dnl
    character(len=1), intent(in), optional :: delimiter
')
dnl
#ifndef DUMMYLIB
ifelse(substr($3,0,4),`Real',`dnl 
    if (present(fmt)) then
      call xml_Add$1(xf=xf, name=name, value=str(value, fmt)`'dnl
ifelse(`$2', `Array', `, ws_significant=.false.')`'dnl
ifelse(`$2', `Matrix', `, ws_significant=.false.'))
    else
  ', substr($3,0,5), `Cmplx', `dnl
    if (present(fmt)) then
      call xml_Add$1(xf=xf, name=name, value=str(value, fmt)`'dnl
ifelse(`$2', `Array', `, ws_significant=.false.')`'dnl
ifelse(`$2', `Matrix', `, ws_significant=.false.'))
    else
  ')dnl
ifelse(substr($3,0,5), `Cmplx', `    ! Add empty optional fmt arg to str to avoid PGI bug: 
  ')dnl
    call xml_Add$1(xf=xf, name=name, value=str(value`'dnl
ifelse(`$2$3', `ScalarCh', `', `$3', `Ch', `, delimiter', substr($3,0,5), `Cmplx', `, ""'))`'dnl
ifelse(`$2', `Array', `, ws_significant=.false.')`'dnl
ifelse(`$2', `Matrix', `, ws_significant=.false.'))
dnl
ifelse(substr($3,0,4), `Real', `dnl
    endif
', substr($3,0,5), `Cmplx', `dnl
    endif
')`'dnl
dnl
#endif
  end subroutine $1$2$3
')dnl
')dnl
dnl
dnl
dnl
! This file is AUTOGENERATED!!!!
! Do not edit this file; edit m_wxml_overloads.m4 and regenerate.
!
!
module m_wxml_overloads

#ifndef DUMMYLIB
  use fox_m_fsys_format, only: str
#endif
  use fox_m_fsys_realtypes, only: sp, dp
  use m_wxml_core, only: xmlf_t
  use m_wxml_core, only: xml_AddCharacters
  use m_wxml_core, only: xml_AddAttribute
  use m_wxml_core, only: xml_AddPseudoAttribute

  implicit none
  private

  interface xml_AddCharacters
m4_foreach(`type', `(Scalar, Array, Matrix)', `dnl
m4_foreach(`x', TOHWM4_types, `dnl
    TOHWM4_subroutinename(`Characters', type, x)
')dnl
')dnl
 end interface

  interface xml_AddAttribute
m4_foreach(`type', `(Scalar, Array, Matrix)', `dnl
m4_foreach(`x', TOHWM4_types, `dnl
    TOHWM4_subroutinename(`Attribute', type, x)
')dnl
')dnl
 end interface

  interface xml_AddPseudoAttribute
m4_foreach(`type', `(Scalar, Array, Matrix)', `dnl
m4_foreach(`x', TOHWM4_types, `dnl
    TOHWM4_subroutinename(`PseudoAttribute', type, x)
')dnl
')dnl
 end interface

  public :: xml_AddCharacters
  public :: xml_AddAttribute
  public :: xml_AddPseudoAttribute

contains

m4_foreach(`ArrayType', `(Scalar, Array, Matrix)', `dnl
m4_foreach(`x', TOHWM4_types, `dnl
TOHWM4_CharacterSub(`Characters', ArrayType, x)
')dnl
')dnl

m4_foreach(`ArrayType', `(Scalar, Array, Matrix)', `dnl
m4_foreach(`x', TOHWM4_types, `dnl
TOHWM4_AttributeSub(`Attribute', ArrayType, x)
')dnl
')dnl

m4_foreach(`ArrayType', `(Scalar, Array, Matrix)', `dnl
m4_foreach(`x', TOHWM4_types, `dnl
TOHWM4_AttributeSub(`PseudoAttribute', ArrayType, x)
')dnl
')dnl

end module m_wxml_overloads
